package org.eda2;

import static org.junit.Assert.*;
import java.io.File;
import java.util.ArrayList;
import org.eda2.InOut;
import org.eda2.Pareto;
import org.eda2.User;
import org.junit.Before;
import org.junit.Test;

/**
 * The Class ParetoTestJUnit4. Clase que prueba la realizacion de la seleccion
 * de los usuarios a estudiar, mediante paretos, con los algoritmos Dyv y
 * Greedy.
 */
public class ParetoTestJUnit4 {

	/** The input directory. */
	String inputDirectory;

	/** The output directory. */
	String outputDirectory;

	/** The pareto. */
	String pareto1 = "";

	/** The pareto mejorado. */
	String paretoMejorado1 = "";

	/** The pareto mejorado. */
	String paretoGreedy1 = "";

	/** The identificador */
	String identificador;

	/**
	 * Sets the up.
	 * 
	 * @throws Exception
	 *             the exception
	 */
	@Before
	public void setUp() throws Exception {

		inputDirectory = System.getProperty("user.dir");
		inputDirectory = inputDirectory + File.separator + "src"
				+ File.separator + "org" + File.separator + "eda2"
				+ File.separator + "entradas" + File.separator;

		outputDirectory = System.getProperty("user.dir");
		outputDirectory = outputDirectory + File.separator + "src"
				+ File.separator + "org" + File.separator + "eda2"
				+ File.separator + "salidas" + File.separator;

		identificador = "2000"; // Elegimos el fichero creado previamente con
								// 'n' usuarios...
	}

	/**
	 * Test pareto. Test, que utilizando paretos y DyV, obtiene la lista de
	 * usuarios como un primer filtrado, obteniendo su tiempo de ejecucion.
	 * Genera un archivo de texto con los usuarios seleccionados.
	 */
	@Test
	public void testPareto() {
		String inputFile = "datosAleatorios" + identificador + ".txt";
		inputFile = inputDirectory + inputFile;
		InOut entrada = new InOut(inputFile);
		entrada.readFile();
		Pareto frontera = new Pareto(entrada.getUserList());
		Long inicio2 = System.nanoTime();
		ArrayList<User> pareto = frontera.paretoFrontier();
		Long fin2 = System.nanoTime();
		Long tiempo2 = (fin2 - inicio2) / 1000000;
		System.out.println("El tiempo de ejecucon de pareto es: " + tiempo2
				+ " milisecs");
		for (User user : pareto) {
			this.pareto1 += user.toString() + "\n";
		}
		String outputDirectory1 = outputDirectory + "SolucionPareto"
				+ identificador + ".txt";
		InOut.guardarUsuariosPareto(pareto, outputDirectory1);

	}

	/**
	 * Test pareto mejorado. Test, que utilizando paretos y DyV, obtiene la
	 * lista de usuarios como un primer filtrado, con la inclusion de la mejora,
	 * obteniendo su tiempo de ejecucion. Genera un archivo de texto con los
	 * usuarios seleccionados.
	 */
	@Test
	public void testParetoMejorado() {
		String inputFile = "datosAleatorios" + identificador + ".txt";
		inputFile = inputDirectory + inputFile;
		InOut entrada = new InOut(inputFile);
		entrada.readFile();
		Pareto frontera = new Pareto(entrada.getUserList());
		Long inicio2 = System.nanoTime();
		ArrayList<User> pareto = frontera.paretoFrontier(0);
		Long fin2 = System.nanoTime();
		Long tiempo2 = (fin2 - inicio2) / 1000000;
		System.out.println("El tiempo de ejecucon de paretoMejorado es: "
				+ tiempo2 + " milisecs");
		for (User user : pareto) {
			this.paretoMejorado1 += user.toString() + "\n";
		}
		String outputDirectory2 = outputDirectory + "SolucionParetoMejorado"
				+ identificador + ".txt";
		InOut.guardarUsuariosPareto(pareto, outputDirectory2);

	}

	/**
	 * Test comparador paretos. Test que compara los 2 2 paretos DyV, el normal
	 * y el mejorado, comprobando que el resultado es el mismo.
	 */
	@Test
	public void testComparadorParetos() {
		testPareto();
		testParetoMejorado();
		testParetoGreedy();
		assertEquals(this.paretoMejorado1, this.pareto1);
	}

	/**
	 * Test ParetoGreedy perteneciente a la PRACTICA 2. Test, que utilizando
	 * paretos y Greedy, obtiene la lista de usuarios como un primer filtrado,
	 * obteniendo su tiempo de ejecucion. Genera un archivo de texto con los
	 * usuarios seleccionados.
	 */
	@Test
	public void testParetoGreedy() {
		String inputFile = "datosAleatorios" + identificador + ".txt";
		inputFile = inputDirectory + inputFile;
		InOut entrada = new InOut(inputFile);
		entrada.readFile();
		Pareto frontera = new Pareto(entrada.getUserList());
		Long inicio2 = System.nanoTime();
		ArrayList<User> pareto = frontera.paretoFrontierGreedy();
		Long fin2 = System.nanoTime();
		Long tiempo2 = (fin2 - inicio2) / 1000000;
		System.out.println("El tiempo de ejecucon de paretoGreedy es: "
				+ tiempo2 + " milisecs");
		for (User user : pareto) {
			this.paretoGreedy1 += user.toString() + "\n";
		}
		String outputDirectory2 = outputDirectory + "SolucionParetoGreedy"
				+ identificador + ".txt";
		InOut.guardarUsuariosPareto(pareto, outputDirectory2);
	}

	/**
	 * Test comparador paretos2. Test que compara el paretos DyV mejorado con el
	 * pareto Greedy, comprobando que el resultado es el mismo.
	 */
	@Test
	public void testComparadorParetos2() {
		testParetoMejorado();
		testParetoGreedy();
		testPareto();
		assertEquals(this.pareto1, this.paretoMejorado1, this.paretoGreedy1);
	}
}
